package bite;
import java.util.*;
/**
 * Creared with IntelliJ IDEA.
 * Description:【发邮件】NowCoder每天要给很多人发邮件。有一天他发现发错了邮件，把发给A的邮件发给了B，把发给B的邮件发给了A。于是他就思考，要给n个人发邮件，
 * 在每个人仅收到1封邮件的情况下，有多少种情况是所有人都收到了错误的邮件？
 * User:yxd
 * Date:2022-06-20
 * Time:21:02
 */
public class Day40_1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            int n = input.nextInt();
            //错排问题
            //状态定义F(i)表示i个人有多少种情况会发错
            //状态转移方程当有i封邮件的时候,除去自己的邮件,第一封信要是装到第二封信里面就会有两种情况(第二封信装到了第一封信里面然后剩下信的出错情况就是i-2,而第二封信没装到第一封信里面出错情况就会有i-1,所以装到第二封信里面就是(i-2)+(i- 1))
            // 而第一封信可以装到后面的所有信中和装到第二封信里面都是一样的,因此总的情况就是i-1种前面的情况,所以剩下的所有情况都会发错就是: F(i) = (i - 1) * (F(i - 1) + F(i -2))
            //赋初值F(2) = 1 F(3) = 2
            long[] dp = new long[n + 1];
            dp[2] = 1;
            if(n == 2){
                System.out.println(dp[2]);
            }else{
                dp[3] = 2;
                for(int i = 4;i <= n;i ++){
                    dp[i] = (i - 1)*(dp[i - 1] + dp[i - 2]);
                }
                System.out.println(dp[n]);
            }
        }
    }
}
